package util;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * JSON工具类
 *
 * @author zhanglinfeng
 * @date create in 2022/9/18 11:44
 */
public class JsonUtil {

    /**
     * 对象转Map
     *
     * @param obj 待转对象
     * @return Map
     */
    public static Map<String, Object> toMap(Object obj) {
        return toMap(JSONObject.toJSONString(obj));
    }

    /**
     * 根据对象的字段类型转Object Map
     *
     * @param obj 待转对象
     * @return
     */
    public static Map<String, Object> toObjMap(Object obj) {
        Map<String, Object> map = new HashMap<>();
        Class<?> clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            if (field.getModifiers() <= 8) {
                try {
                    Optional.ofNullable(field.get(obj)).ifPresent(t -> map.put(field.getName(), t));
                } catch (IllegalAccessException ignored) {
                }
            }
        }
        return map;
    }

    /**
     * 字符串转Map
     *
     * @param str 待转对字符串
     * @return Map
     */
    public static Map<String, Object> toMap(String str) {
        return JSONObject.parseObject(str, Map.class);
    }

    /**
     * 字符串转对象
     *
     * @param jsonString 待转字符串
     * @param cls        class
     * @return T
     */
    public static <T> T toObject(String jsonString, Class<T> cls) {
        return JSONObject.parseObject(jsonString, cls);
    }

    /**
     * 字符串转List
     *
     * @param jsonString 待转字符串
     * @param cls        class
     * @return List<T>
     */
    public static <T> List<T> toList(String jsonString, Class<T> cls) {
        return JSONArray.parseArray(jsonString).toList(cls);
    }

    /**
     * 对象转字符串
     *
     * @param obj 待转对象
     * @return String
     */
    public static String toString(Object obj) {
        return JSONObject.toJSONString(obj);
    }

}
